/*
 * 温馨提示:请勿随便修库中的变量类型，所有变量类型都是经过深思熟虑的，如要修改，请将与该变量相关的部分也需要修改。
 */
#pragma once

#include <stdbool.h>
#include <stdint.h>

// 设备地址最大长度
#define modbus_device_address_max_len 255

// 一帧数据最大长度
#define modbus_frame_max_len 255

// 设备表格最大长度
#define modbus_dev_table_max_len 255

// 发送buffer最大长度
#define modbus_send_buffer_max_len 65535

typedef void (*modbus_send_cb)(uint8_t* data, uint8_t data_len);

/* 开关量结构体 */
typedef struct {
  char*    name;
  uint16_t address;
  bool*    data;
  bool     write_mask; /* 数据是否可以写入 */
} modbus_switch_table_value_t;

/* 寄存器结构体 */
typedef struct {
  char*     name;
  uint16_t  address;
  uint16_t* data;
  bool      write_mask; /* 数据是否可以写入 */
} modbus_register_table_value_t;

typedef struct {
  modbus_switch_table_value_t*   switch_table;       /* 开关量表 */
  uint8_t                        switch_table_len;   /* 开关量表大小 */
  modbus_register_table_value_t* register_table;     /* 寄存器表 */
  uint8_t                        register_table_len; /* 寄存器表大小 */
} modbus_data_table_t;

typedef struct {
  uint8_t              device_address;     /* 设备地址(地址域) */
  modbus_data_table_t* data_table;         /* 数据表 */
  uint8_t*             send_buffer;        /* 发送数据用的buffer */
  uint16_t             send_buffer_len;    /* 发送数据用的buffer大小 */
  modbus_send_cb       send_cb;            /* 数据发送接口 */
  uint16_t             frame_data_max_len; /* 帧数据最大长度 */
} modbus_dev_table_t;

/***************************************************************************************************
 * ********************************************modbus********************************************* *
 ***************************************************************************************************/
void modbus_dev_reg(modbus_dev_table_t* table, uint8_t table_size);
bool modbus_receive(uint8_t* data, uint16_t data_len);
uint16_t mobuds_send(uint8_t* data, uint16_t data_len);

/***************************************************************************************************
 * ********************************提供给外部查询数据表下标的接口********************************* *
 ***************************************************************************************************/
int32_t modbus_find_switch_table_index_from_data_address(uint8_t device_address, uint16_t data_address);
int32_t modbus_find_register_table_index_from_data_address(uint8_t device_address, uint16_t data_address);

uint32_t modbus_soft_release_version_get(void);